package com.zenithmind.task.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 任务优先级枚举
 * 遵循面向对象设计原则：
 * 1. 开闭原则：支持优先级行为扩展
 * 2. 单一职责原则：专注于优先级定义和比较
 * 3. 封装原则：提供优先级判断和比较方法
 *
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Getter
@AllArgsConstructor
public enum TaskPriority {

    /**
     * 低优先级
     */
    LOW(1, "低", "low", "#52c41a"),

    /**
     * 中等优先级
     */
    MEDIUM(2, "中", "medium", "#1890ff"),

    /**
     * 高优先级
     */
    HIGH(3, "高", "high", "#fa8c16"),

    /**
     * 紧急
     */
    URGENT(4, "紧急", "urgent", "#f5222d");

    /**
     * 优先级码
     */
    private final Integer code;

    /**
     * 优先级名称
     */
    private final String name;

    /**
     * 优先级标识
     */
    private final String key;

    /**
     * 显示颜色
     */
    private final String color;

    // 缓存映射，提高查询性能
    private static final Map<Integer, TaskPriority> CODE_MAP =
        Arrays.stream(values()).collect(Collectors.toMap(TaskPriority::getCode, Function.identity()));

    private static final Map<String, TaskPriority> KEY_MAP =
        Arrays.stream(values()).collect(Collectors.toMap(TaskPriority::getKey, Function.identity()));

    /**
     * 根据优先级码获取枚举
     *
     * @param code 优先级码
     * @return 任务优先级枚举
     */
    public static TaskPriority getByCode(Integer code) {
        return CODE_MAP.get(code);
    }

    /**
     * 根据优先级标识获取枚举
     *
     * @param key 优先级标识
     * @return 任务优先级枚举
     */
    public static TaskPriority getByKey(String key) {
        return KEY_MAP.get(key);
    }

    /**
     * 检查是否为高优先级（高或紧急）
     * 
     * @return 是否高优先级
     */
    public boolean isHighPriority() {
        return this == HIGH || this == URGENT;
    }

    /**
     * 检查是否为紧急优先级
     * 
     * @return 是否紧急
     */
    public boolean isUrgent() {
        return this == URGENT;
    }

    /**
     * 获取优先级权重（用于排序）
     *
     * @return 权重值
     */
    public int getWeight() {
        return this.code;
    }

    /**
     * 比较优先级高低
     *
     * @param other 另一个优先级
     * @return 比较结果：正数表示当前优先级更高，负数表示更低，0表示相等
     */
    public int compareWith(TaskPriority other) {
        if (other == null) {
            return 1;
        }
        return Integer.compare(this.code, other.code);
    }

    /**
     * 检查是否比另一个优先级高
     *
     * @param other 另一个优先级
     * @return 是否更高
     */
    public boolean isHigherThan(TaskPriority other) {
        return compareWith(other) > 0;
    }

    /**
     * 检查是否比另一个优先级低
     *
     * @param other 另一个优先级
     * @return 是否更低
     */
    public boolean isLowerThan(TaskPriority other) {
        return compareWith(other) < 0;
    }

    /**
     * 获取所有高优先级（高和紧急）
     *
     * @return 高优先级列表
     */
    public static TaskPriority[] getHighPriorities() {
        return Arrays.stream(values())
                    .filter(TaskPriority::isHighPriority)
                    .toArray(TaskPriority[]::new);
    }

    /**
     * 获取优先级描述
     *
     * @return 优先级描述
     */
    public String getDescription() {
        switch (this) {
            case LOW:
                return "低优先级任务，可以稍后处理";
            case MEDIUM:
                return "中等优先级任务，按计划处理";
            case HIGH:
                return "高优先级任务，需要优先处理";
            case URGENT:
                return "紧急任务，需要立即处理";
            default:
                return "未知优先级";
        }
    }

    /**
     * 获取优先级图标
     *
     * @return 图标名称
     */
    public String getIcon() {
        switch (this) {
            case LOW:
                return "arrow-down";
            case MEDIUM:
                return "minus";
            case HIGH:
                return "arrow-up";
            case URGENT:
                return "exclamation";
            default:
                return "question";
        }
    }

    /**
     * 获取建议的处理时间（小时）
     *
     * @return 建议处理时间
     */
    public int getSuggestedHandlingHours() {
        switch (this) {
            case LOW:
                return 72; // 3天
            case MEDIUM:
                return 24; // 1天
            case HIGH:
                return 8;  // 8小时
            case URGENT:
                return 2;  // 2小时
            default:
                return 24;
        }
    }

    /**
     * 检查是否需要立即处理
     *
     * @return 是否需要立即处理
     */
    public boolean requiresImmediateAttention() {
        return this == URGENT;
    }

    /**
     * 获取CSS样式类
     *
     * @return CSS样式类
     */
    public String getCssClass() {
        switch (this) {
            case LOW:
                return "priority-low";
            case MEDIUM:
                return "priority-medium";
            case HIGH:
                return "priority-high";
            case URGENT:
                return "priority-urgent";
            default:
                return "priority-unknown";
        }
    }
}
